package 蓝桥算法;

import java.util.Random;
import java.util.StringJoiner;

public class 快速排序 {
    public static void main(String[] args) {
        //    ---递归排序---

        int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};// （3 1 2 5 4 6 9 7 10 8） 第一次 （6 1 2 5 9 3 4 7 10 8）
        // （6 1 2 5 4 3 9 7 10 8）
        quickSort(arr, 0, arr.length - 1);

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        //运行时间
        elapsedtime();
    }

    private static void elapsedtime() {
        int[] arr = new int[10000];
        Random r = new Random();
        StringJoiner sj = new StringJoiner(",", "[", "]");
        for (int i = 0; i < arr.length; i++) {
            arr[i] = r.nextInt(10000);
            sj.add(Integer.toString(arr[i]));
        }

        long start = System.nanoTime();
        quickSort(arr, 0, arr.length - 1);
        long end = System.nanoTime();
        System.out.println(sj.toString());
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        System.out.println(end - start);
    }

    private static void quickSort(int[] arr, int i, int j) {
        int start = i;
        int end = j;
        //出口:
        if (start > end) {
            return;
        }
        int baseNumber = arr[i]; //基数

        while (start < end) {
            /*
            * 为什么end指针先动，因为基数在左边，最后交汇值必须可以放在左边和基数调换
            * 如果是start指针先动，则交汇值可能为大于基数，和基数调换时候不合理
            * */
            while (true) {
                if (arr[end] < baseNumber || end <= start) {
                    break;
                }
                end--;
            }
            while (true) {
                if (arr[start] > baseNumber || start >= end) {
                    break;
                }
                start++;
            }

            //以上两个while循环找到对应需要交换位置的数值
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
        //
        int temp = arr[start];
        arr[start] = arr[i];
        arr[i] = temp;
        //递归找出口：
        quickSort(arr, i, start - 1);
        quickSort(arr, start + 1, j);
    }
}
